package bee.besta.business.service;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Passport implements Serializable {

	/**
	 * session id
	 */
	public static String SESSIONID = "$s";

	/**
	 * 多语言
	 */
	public static String LOCALE = "$l";

	/**
	 * 客户端类型
	 */
	public static String CLIENT = "$c";

	/**
	 * 会话摘要
	 */
	public static String DIGEST = "$d";

	private static final long serialVersionUID = 2279562356766654615L;

	private Map<String, String> properties;

	private transient static final Pattern pstrPattern = Pattern
			.compile("(([a-z|A-Z|\\$]{1}[a-z|A－Z|\\.|0-9]*)\\=([^\\&|^\\=]+))\\&?");;

	private Object dataObject;

	/**
	 * 通行证构造函数
	 * 
	 */
	public Passport() {
		this("");
	}

	/**
	 * 通行证构造函数
	 * 
	 * @param pstr
	 *            通行证的字符串表示形式，如a=xxx&b=yyy
	 */
	public Passport(String pstr) {

		properties = new HashMap<String, String>();

		Matcher m = pstrPattern.matcher(pstr);
		while (m.find()) {
			properties.put(m.group(2), m.group(3));
		}
	}

	/**
	 * 通行证构造函数
	 * 
	 * @param properties
	 *            通行证的属性集
	 */
	public Passport(Map<String, String> properties) {
		this.properties = properties;
	}

	/**
	 * 获取通行证的属性
	 * 
	 * @param key
	 *            属性名
	 */
	public String getProperty(String key) {
		return properties.get(key);
	}

	/**
	 * 设置通行证的属性
	 * 
	 * @param key
	 *            属性名
	 * @param value
	 *            属性值
	 */
	public void setProperty(String key, String value) {
		if (value == null) {
			properties.remove(key);
		} else {
			properties.put(key, value);
		}

	}

	/**
	 * 获取国家/语言字符串，属性名为：$l
	 * 
	 */
	public String getLocale() {
		return getProperty(LOCALE);
	}

	/**
	 * 设置国家/语言字符串，属性名为：$l
	 * 
	 * @param lc
	 */
	public void setLocale(String lc) {
		setProperty(LOCALE, lc);
	}

	/**
	 * 获取会话ID，属性名为：$s
	 * 
	 * @return
	 */
	public String getSessionId() {
		return getProperty(SESSIONID);
	}

	/**
	 * 设置会话ID，属性名为：$s
	 * 
	 * @param sid
	 *            会话ID
	 */
	public void setSessionId(String sid) {
		setProperty(SESSIONID, sid);
	}

	/**
	 * 设置数据对象，此对象要求可序列化
	 * 
	 * @param dataObject
	 *            可序列化的数据对象
	 */
	public void setDataObject(Object dataObject) {
		this.dataObject = dataObject;
	}

	/**
	 * 获取数据对象
	 * 
	 * @param returnType
	 *            数据对象类型
	 * @return 可序列化的数据对象
	 */
	public <T> T getDataObject(Class<T> returnType) {

		if (dataObject == null)
			return null;

		if (returnType.equals(dataObject.getClass())) {
			return (T) dataObject;
		}
		return null;
	}

	/**
	 * 获取数据对象
	 * 
	 * @return 可序列化的数据对象
	 */
	public Object getDataObject() {
		return dataObject;
	}

	/**
	 * 转换成字符格式，形如：a=xxx&b=yyy
	 */
	public String toString() {
		StringBuffer id = new StringBuffer();
		Set<String> keys = properties.keySet();
		for (String key : keys) {
			id.append(key.toString());
			id.append("=");
			id.append(properties.get(key));
			id.append("&");
		}
		if (id.length() > 0) {
			return id.substring(0, id.length() - 1);
		} else {
			return "";
		}
	}

	//
	// public static void main(String[] args) {
	// Matcher m = pstrPattern.matcher("$xi$a=.zh_CN");
	// while (m.find()) {
	// System.out.println("key=" + m.group(2) + " value=" + m.group(3));
	// }
	//
	// }
	// passport规范：字段名由字母、句点与数字、$组成，并且以字母/$开头；字段值中不能包含＝、&字符。
}
